// DAO/Impl/UserDaoImpl.java
package com.hp.DAO.Impl;                         // 实现类放在 DAO 的子包 Impl

import com.hp.DAO.BaseDao;                       // 继承 BaseDao 以复用通用 JDBC 封装
import com.hp.DAO.UserDao;                       // 实现的接口：UserDao
import com.hp.Model.User;                        // 领域实体：User
import com.hp.Util.RowMapper;                    // 行映射器：ResultSet -> User
import com.hp.Util.SimpleJdbcTemplate;           // JDBC 模板（通过构造器注入）

import java.sql.Timestamp;                // 用于 Date <-> SQL Timestamp 转换
import java.util.Date;                    // 统一使用 java.util.Date
import java.util.List;                    // List 集合

/** UserDao 的 JDBC 实现 */
public class UserDaoImpl extends BaseDao implements UserDao {   // 继承 BaseDao，并实现 UserDao
    public UserDaoImpl(SimpleJdbcTemplate jdbc) {               // 构造器注入 JDBC 模板
        super(jdbc);                                            // 调用父类构造器
    }

    // 通用 RowMapper：把一行结果映射为 User
    private static final RowMapper<User> M = rs -> {            // lambda 实现 RowMapper
        User u = new User();                                    // 创建实体
        u.setId(rs.getLong("id"));                              // 映射 id
        u.setName(rs.getString("name"));                        // 姓名
        u.setEmail(rs.getString("email"));                      // 邮箱
        u.setPasswordHash(rs.getString("password_hash"));       // 密码哈希
        u.setRole(rs.getString("role"));                        // 角色
        Timestamp ts = rs.getTimestamp("created_at");           // 创建时间
        u.setCreatedAt(ts == null ? null : new Date(ts.getTime())); // 转为 Date
        return u;                                               // 返回映射结果
    };

    @Override
    public User findById(Long id) {                             // 按主键查询
        String sql = "SELECT id,name,email,password_hash,role,created_at FROM `user` WHERE id=?"; // SQL
        return queryOne(sql, M, id);                            // 执行查询
    }

    @Override
    public User findByEmail(String email) {                     // 按邮箱查询
        String sql = "SELECT id,name,email,password_hash,role,created_at FROM `user` WHERE email=?"; // SQL
        return queryOne(sql, M, email);                         // 执行查询
    }

    @Override
    public List<User> listByRole(String role, int offset, int limit) { // 按角色分页
        String sql = "SELECT id,name,email,password_hash,role,created_at " +
                "FROM `user` WHERE role=? ORDER BY id DESC LIMIT ? OFFSET ?"; // SQL
        return queryList(sql, M, role, limit, offset);          // 执行列表查询
    }

    @Override
    public Long insert(User u) {                                // 新增用户
        String sql = "INSERT INTO `user` (name,email,password_hash,role,created_at) VALUES (?,?,?,?,?)"; // SQL
        Date created = u.getCreatedAt() == null ? new Date() : u.getCreatedAt(); // 默认当前时间
        return execInsertReturnId(sql, u.getName(), u.getEmail(), u.getPasswordHash(), u.getRole(),
                new Timestamp(created.getTime()));              // 执行插入并返回自增ID
    }

    @Override
    public int updateBasic(User u) {                            // 更新基础字段
        String sql = "UPDATE `user` SET name=?, role=? WHERE id=?"; // SQL
        return execUpdate(sql, u.getName(), u.getRole(), u.getId()); // 执行更新
    }

    @Override
    public int deleteById(Long id) {                            // 删除
        String sql = "DELETE FROM `user` WHERE id=?";           // SQL
        return execUpdate(sql, id);                             // 执行删除
    }
}
